// 对象处理的方法集合
import { set, get } from "lodash-es"

export namespace Obj {
    // 递归遍历对象所有可枚举属性，并返回属性列表,属性采用 数组的方式存储 ，用 . 号存储会导致 部分 bug ，如果属性名本身包含 . 号就会出错。
    export const deepKeys = (obj: any, pk?: string[]) => {
        if (obj != null && typeof obj === 'object') {
            const res: string[][] = [];
            const ks = Object.keys(obj);
            for (const k of ks) {
                const r = deepKeys(obj[k], pk ? [...pk, k] : [k]);
                res.push(...r)
            }
            return res;
        } else {
            return pk ? [pk] : [];
        }
    }

    // 递归遍历对象所有的可枚举属性，并返回属性名和属性值集合，属性名采用数组存储 ， 整体采用 map 存储
    export const deepObj = (obj: any, pk?: string[]) => {
        if (obj != null && typeof obj === 'object') {
            const res = new Map();
            const ks = Object.keys(obj);
            for (const k of ks) {
                const r = deepObj(obj[k], pk ? [...pk, k] : [k]);
                for (const [key, value] of r.entries()) {
                    res.set(key, value)
                }
            }
            return res;
        } else {
            const res = new Map();
            pk && res.set(pk, obj)
            return res;
        }
    }

    // 获取一个对象和原对象比较之后改变的部分
    export const diffObj = (target: any, source: any) => {
        const keys = deepKeys(target);
        const res: any = {}
        for (const key of keys) {
            const v = get(target, key);
            const sv = get(source, key);
            if (v != sv) {
                set(res, key, v)
            }
        }

        return res;
    }
}
